var express = require('express');
var router = express.Router();
const uuid = require("node-uuid");
const md5 = require("md5");

const sql = require("../sql/sql");//引入增删改查命令
const user = require("../sql/user")//引入创建users集合的模块
const tools = require("../tools");//引入发送短信和随机数的模块
const jwt = require("jsonwebtoken");//引入token模块



// 发送短信的接口
router.get('/sendMsg', function(req, res, next) {
    let rn = tools.randomNum(4);//随机数模块产生4位数随机数
    tel = req.query.tel;//接收前端发的手机号
    //根据手机号查询用户集合
    sql.find(user,{tel},{}).then((data)=>{
        //如集合中根据手机号能查询到数据
        if(data.length>0){
            //判断该数据中是否有用户名和密码字段
            if(data[0].userName && data[0].passWord ){
                //如果用户名和密码不为空，表示已经注册了
                res.send({
                    state:201,
                    title:"该手机号已被注册",
                })    
            }else{
                //如果为空，表示发过验证码，但是未注册，从新发送验证码即可，然后更新验证码
                tools.sendMsg(tel,rn).then(()=>{
                    //更新验证码
                    sql.update(user,{tel},{code:rn});
                    //给前端返回数据
                    res.send({
                        state:200,
                        title:"已经发送过验证码，重新发送",
                        code:rn   //测试用，将来要删除
                    })
                })
            }
        }else{
            //如果没有查询到手机信息，则把手机和验证码插入集合
            tools.sendMsg(tel,rn).then(()=>{
                sql.insert(user,{
                    tel,
                    code:rn
                });
                res.send({
                    state:200,
                    title:"短信验证码发送成功",
                    code:rn //测试用，将来要删除
                })
            }),()=>{
                res.send({
                    state:201,
                    title:"短信验证码发送失败，默认验证码位1234",
                    code:1234
                })
            }       
        }
    })
});

/**
* @apiGroup 用户信息
* @api {get} /api/user/sendMsg 短信验证码
* @apiVersion 0.0.0
* @apiDescription 发送短信验证码
* @apiParam {String} tel 接收短信验证码的手机号
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {array} data 请求数据
* @apiSuccessExample {json} Success-Response:
* {
*    "state":200,
*    "title":"发送成功",
*    "code":"1234"
* }
* @apiError {number} state 请求状态
* @apiError {string} title 请求说明
* @apiErrorExample {json} Error-Response:
* {
*    "code":201,
*    "title":"发送失败",
* }
* {
*    "code":201,
*    "title":"改手机号已被注册",
* }
* @apiSampleRequest http://localhost:3001/api/user/sendMsg
*/


//用户注册的接口
router.post('/register', function(req, res, next) {
    //手机号，用户名，验证码，密码
    const {tel,userName,code,passWord} = req.body;
    //发送查询命令，验证用户名是否被注册过
    sql.find(user,{userName},{}).then((data)=>{
        //如注册过的话，提示该用户已被占用
        if(data.length>0){
            res.send({
                state:201,
                title:"用户名已被注册"
            })
        }else{//如用户名没有被注册，验证手机号是否存在
            //发送查询命令，查询集合中是否有该手机号
            sql.find(user,{tel},{}).then((data1)=>{
                //如手机号不存在，直接提示用户先获取短信验证
                if(data1.length<=0){
                    res.send({
                        state:202,
                        title:"请先获取短信验证码"
                    })
                //如果手机号存在，根据手机号，验证该手机号所在条目信息账户名是否存在，如存在提示一个手机号只能注册一个账号    
                }else if(data1[0].userName){
                    res.send({
                        state:203,
                        title:"一个手机号只能注册一个账号"
                    })
                //账户名不存在验证手机验证码是否相等
                }else if(data1[0].code == code){
                //如果验证码正确，给密码加密，一手机号为条件，查询数据后，更新该条目数据
                    sql.update(user,{tel},{
                        userId:"user"+uuid.v1(),   // 用户id
                        userName, // 用户名
                        nickName:"临时用户", // 昵称
                        passWord:md5(passWord), // 密码
                        email:"",    // 邮箱
                        avatar:"",   // 头像
                        birthday:Date.now(), // 生日 - 时间戳
                        sex:1,      // 1男，0女 
                        hobby:[],     // 兴趣爱好
                        regTime:Date.now(),  // 注册时间
                        lastTime:0, // 上一次登录时间/最后一次登录时间
                        loginState:0,   // 1已登录，0未登录
                    })
                    res.send({
                        state:200,
                        title:"注册成功"
                    })
                }else{
                    //手机验证码不正确的处理
                    res.send({
                        state:204,
                        title:"验证码错误"
                    })
                }
            })
        }
    })
});

/**
* @apiGroup 用户信息
* @api {post} /api/user/register 用户注册
* @apiVersion 0.0.0
* @apiDescription 用户注册
* @apiParam {String} userName 用户名
* @apiParam {String} tel 手机号
* @apiParam {String} passWord 密码
* @apiParam {String} code 短信验证码
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {array} data 请求数据
* @apiSuccessExample {json} Success-Response:
* {
*    "state":200,
*    "title":"注册成功",
* }
* @apiError {number} state 请求状态
* @apiError {string} title 请求说明
* @apiErrorExample {json} Error-Response:
* {
*    "code":201,
*    "title":"用户名已被注册",
* }
* {
*    "code":202,
*    "title":"请先获取短信验证码",
* }
* {
*    "code":203,
*    "title":"一个手机号只能注册一个账号",
* }
* {
*    "code":204,
*    "title":"验证码错误",
* }
* @apiSampleRequest http://localhost:3001/api/user/register
*/


//用户登录的接口
router.get('/login', function(req, res, next) {
    //手机号，用户名，密码
    const {tel="",userName="",passWord} = req.query;
    //根据用户名或手机号发送查询命令，验证用户名是否已注册
    sql.find(user,{$or:[{userName},{tel}]},{_id:0,__v:0}).then((data)=>{
        //如未注册过，提示该用户先注册
        if(data.length<=0){
            res.send({
                state:201,
                title:"请先注册"
            })
        }else{//如用户名已注册，
            //发送查询命令，验证密码是否正确
            if(data[0].passWord == md5(passWord)){
                // 参数1：要存储的数据
                // 参数2：加密因子
                // 参数3：有效期时间
                const token = jwt.sign({
                    userId: data[0].userId,
                    isLogin:"ok"
                }, "乾坤未定，你我皆是黑马", {
                    expiresIn: 60 * 60
                });//设置token的时效
                res.send({
                    state:200,
                    title:"登录成功",
                    userId:data[0].userId,
                    token
                })
                sql.update(user,{userId:data[0].userId},{
                    lastTime:Date.now(),
                    loginState:1
                })
            }else{
                res.send({
                    state:202,
                    title:"密码错误",
                })
            }
        }
    })
});

/**
* @apiGroup 用户信息
* @api {get} /api/user/login 用户登录
* @apiVersion 0.0.0
* @apiDescription 用户登录
* @apiParam {String} userName 用户名
* @apiParam {String} tel 手机号
* @apiParam {String} passWord 密码
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {array} data 请求数据
* @apiSuccessExample {json} Success-Response:
* {
*    "state":200,
*    "title":"登录成功",
*    "userId":"id",
* }
* @apiError {number} state 请求状态
* @apiError {string} title 请求说明
* @apiErrorExample {json} Error-Response:
* {
*    "code":201,
*    "title":"请先注册",
* }
* {
*    "code":202,
*    "title":"密码错误",
* }
* @apiSampleRequest http://localhost:3001/api/user/login
*/

//获取用户信息的接口
router.get('/getUser', function(req, res, next) {
    const {userId} = req.query;
    const {token} = req.headers;
    tools.verify(token).then((result)=>{
        sql.find(user,{userId},{_id:0,__v:0}).then((data)=>{
            res.send({
                state:200,
                title:"获取个人信息成功",
                res:result,
                data:data
            })
        })
    }).catch(()=>{
        res.send({
            state:10086,
            title:'登录已失效，请重新登录'
        })
    })
});

/**
* @apiGroup 用户信息
* @api {get} /api/user/getUser 获取用户信息
* @apiVersion 0.0.0
* @apiDescription 根据用户id获取用户信息
* @apiParam {String} userId 用户的唯一id
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {array} data 请求到的数据
* @apiSuccessExample {json} Success-Response:
* {
*    "state":200,
*    "title":"获取个人信息成功",
*    "data":data,
* }
* @apiError {number} state 请求状态
* @apiError {string} title 请求说明
* @apiErrorExample {json} Error-Response:
* {
*    "code":201,
*    "title":"未知错误",
* }
* @apiSampleRequest http://localhost:3001/api/user/getUser
*/

//修改用户信息的接口
router.post('/setUser', function(req, res, next) {
    const {userId} = req.body;
    const {userData} = req.body;
    const {token} = req.headers;
    tools.verify(token).then((result)=>{
        sql.update(user,{userId},userData).then(()=>{
            sql.find(user,{userId},{_id:0,__v:0}).then((data)=>{
                res.send({
                    state:200,
                    title:"修改个人信息成功",
                    data:data
                })
            })
        })
    }).catch(()=>{
        res.send({
            state:10086,
            title:'登录已失效，请重新登录'
        })
    })
});

/**
* @apiGroup 用户信息
* @api {post} /api/user/setUser 修改用户信息
* @apiVersion 0.0.0
* @apiDescription 根据用户id和修改的数据修改用户信息
* @apiParam {String} userId 用户的唯一id
* @apiParam {object} userData 用户修改的数据
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {array} data 请求到的数据
* @apiSuccessExample {json} Success-Response:
* {
*    "state":200,
*    "title":"修改个人信息成功",
*    "data":data,
* }
* @apiError {number} state 请求状态
* @apiError {string} title 请求说明
* @apiErrorExample {json} Error-Response:
* {
*    "code":201,
*    "title":"未知错误",
* }
* @apiSampleRequest http://localhost:3000/api/user/setUser
*/

module.exports = router;


